import pandas as pd
from datetime import datetime
# 时间序列：时间戳（某一确定时间） 时间周期（时间段）

# 时间戳

#创建时间戳（转型）
ts=pd.to_datetime("2025-04-21")
print(ts)
ts2=pd.to_datetime(["20250419","2025/4/20","2025-4-21"],format='mixed')
s1=pd.Series([11,35,23],index=ts2)
print(s1)
ts3=pd.to_datetime(["2015/5/30","2017-2-1","2015.6.1","20160401","6/1/2017",datetime(2018,1,23)],format="mixed")
df=pd.DataFrame([[14,38],[56,25],[65,74],[88,94],[65,34],[35,92]],index=ts3)
print(df)
print(df.loc["2015/6/1"])
print(df.loc["2017"])
print(df.loc["2015-5"])
print(df.sort_index().truncate(before="2016-1-1")) # 删掉2016年之前的数据
print(df.sort_index().truncate(after="2017-5-1")) # 删掉2017年之后的数据

# 生成固定频率的时间段
ts4=pd.date_range("2025/4/1","2025/4/5") # 默认antian
print(ts4)
ts5=pd.date_range(start="20250401",periods=10) # 20250401开始10天
print(ts5)
ts6=pd.date_range(end="20250401",periods=10) # 20250401为止的10天
print(ts6)
ts7=pd.date_range("20250101",periods=5,freq="ME") # 从20250101隔一个月取一天，总共5天
print(ts7)
ts8=pd.date_range("20250401","20250421",freq="W-SUN")
print(ts8)
#  时间移动
ts9=pd.date_range("2025/1/1",periods=5)
s2=pd.Series([4,1,2,8,6],index=ts9)
print(s2)
s2=s2.shift(1)
print(s2)
# 时间周期
p1=pd.Period("2017/6")
print(p1)
print(p1-5) # 按照最小的单位计算
#生成固定频率的时间周期
p2=pd.period_range("202501","202506",freq='M')
print(p2)
p3=pd.period_range("2015","2017",freq='A-DEC')
print(p3)
p4=pd.PeriodIndex(pd.period_range("20250310","20250415",freq="W-MON")) #共7周
df2=pd.DataFrame([41,63,87,63,74,45,96],index=p4)
print(df2)
# 时间频率转换
p5=pd.Period("2017",freq="A-DEC")
print(p5)
print(p5.asfreq('M',how='start')) # 年->月，取第一个
print(p5.asfreq('M',how='end')) # 年->月，取最后一个

# 重采样：粗化时间/细化时间
d1=pd.date_range("2025.4.1",periods=30)
s3=pd.Series(range(30,60),index=d1)
print(s3)
t1=s3.resample("W-MON").mean() # 计算平均值并赋给最后一天
print(t1)
t2=s3.resample('W-MON',closed="left").mean() # 含第一天不含最后一天
print(t2)
t3=s3.resample('W-MON',closed="right").mean() # 含第一天不含最后一天
print(t3)
# 降采样：粗化时间
d2=pd.date_range("20250101",periods=12,freq="T")
s4=pd.Series(range(12),index=d2) # 每1分钟的数据
print(s4)
t4=s4.resample('5min',closed="right").sum() # 每5分钟之和的数据
print(t4)
t5=s4.resample('5min',closed="left").sum() # 每5分钟之和的数据
print(t5)

t6=pd.Series(range(30),index=d1)
t7=t6.resample('7D').ohlc()
print(t7)
# 升采样：细化时间 -> 插值
d3=pd.date_range("20250405",periods=2,freq="W-SUN")
df3=pd.DataFrame({"A":[101,330],"B":[210,460],"C":[150,580]},index=d3) # 2周数据
print(df3)
tdf1=df3.resample('D').ffill() # 用前值填充空白
print(tdf1)
tdf2=df3.resample('D').bfill() # 用后值填充空白
print(tdf2)
# 时间周期重采样
import numpy as np
d4=pd.period_range("2024-1","2024-12",freq="M")
df4=pd.DataFrame({"CO":np.random.randn(12),"TE":np.random.randn(12),"NY":np.random.randn(12),"OH":np.random.randn(12)},index=d4)
print(df4)
tdf3=df4.resample('A-DEC').mean()
print(tdf3)
tdf4=tdf3.resample('Q-DEC').ffill()
print(tdf4)
tdf5=tdf3.resample('Q-DEC',convention='end').ffill() # 只保留最后一条
print(tdf5)

#滑动窗口：定长
d5=pd.date_range("20250401",periods=10)
df5=pd.DataFrame({"日期":d5,"销售额":[123,681,861,671,531,153,138,414,313,564]}).set_index('日期')
print(df5)

df5['3天滑动平均值']=df5['销售额'].rolling(window=3).mean()
print(df5)

df5['5天滑动标准差']=df5['销售额'].rolling(window=5).std()
print(df5)

df5['7天滑动极差']=df5['销售额'].rolling(window=7).apply(lambda x:x.max()-x.min())
print(df5)

#累积窗口：越来越长
df5['累积均值']=df5['销售额'].expanding(min_periods=3).mean()
print(df5)

df5['累积最大值']=df5['销售额'].expanding().max()
df5['累积最小值']=df5['销售额'].expanding().min()
print(df5)






